package com.hup.winHolderService.ws.handler.parser;

import com.alibaba.fastjson.JSON;
import com.hup.winHolderService.framework.exception.AppServerException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * [文件]消息处理器
 * 仅示例!!!!!!
 * gpt建议用Base64编解码二级制数据,然后统一用json收发数据, 更易读...
 * 使用Base64编码后，文件大小会增加大约33%
 *
 * @author hugan
 * @date 2023/10/8
 */
@Slf4j
public class WsFileParser extends WsDataParser {

    /**
     * @param msg 格式: [type,json信息长度,json字符串,文件数据]
     */
    @Override
    public Object parse(byte[] msg, Class<?> dataClz) {
        try {
            WsFileReq req = new WsFileReq();

            /*
            msg[0]是type
            json信息长度=[1,127]
            注意!! 这里应该用多位byte 表示长度!!!!!
             */
            byte jsonLength = msg[1];
            String json = new String(msg, 2, jsonLength, StandardCharsets.UTF_8);
            WsFileReqInfo info = JSON.parseObject(json, WsFileReqInfo.class);
            //
            File file = File.createTempFile(System.currentTimeMillis() + Thread.currentThread().getName(), ".wsfile");
            int offset = 2 + jsonLength;
            int fileLength = msg.length - offset;
            FileUtils.writeByteArrayToFile(file, msg, offset, fileLength);
            file.deleteOnExit();

            req.setInfo(info);
            req.setTempFile(file);
            return req;
        } catch (Exception e) {
            throw new AppServerException("[文件消息]解析异常", e);
        }
    }

    /**
     * 文件req
     * 仅示例!!
     */
    @Data
    public static class WsFileReq {

        /**
         * 文件请求消息
         */
        private WsFileReqInfo info;

        /**
         * 请求处理完后,建议马上手动删除文件!!
         */
        private File tempFile;

    }

    @Data
    public static class WsFileReqInfo {
        private String fileName;
        private String sendTo;
    }

}
